/*
 * Passager.cpp
 *
 *  Created on: 10 mars 2011
 *      Author: Julien
 */

#include "Passager.h"

void ajouterThread(pthread_t thread, int type_thread);

Passager::Passager(Station * station) {
	this->stationMontee = station;
}

void Passager::attendreTramway(){
	if(!this->aUnTicket && !this->estAbonne){
		this->acheterTicket();
	}
	// On rejoint la file d'attente de la station
	this->placeFileAttenteStation = this->stationMontee->rejoindreFileAttente(this);

	sigset_t signal;
	// On s'assure que le masque est vide
	if(sigemptyset(&signal) == -1) {
		perror("Erreur sigemptyset");
	}
	// On ajoute le signal SIGUSR1 au masque
	if(sigaddset(&signal, SIGUSR1) == -1) {
		perror("Erreur sigaddset");
	}
	int sigIntercepte;
	sigwait(&signal, &sigIntercepte);
	// On attend que le signal SIGUSR1 se présente, qui aura pour conséquence
	// de changer l'état du feu
	if(sigIntercepte == SIGUSR1) {
		this->stationMontee->quitterFileAttente(this->placeFileAttenteStation);
		this->stationMontee->getContenu()->rejoindreVoiture(this);
	}
}

void Passager::acheterTicket(){
	if(this->stationMontee->getBorneAchat()->acheterUnTicket()){
		this->aUnTicket = true;
	}
}

void Passager::demanderArret(){

}

void Passager::demarrerThread(){
	if (pthread_create(&thread, 0, Passager::threadPassager, this) != 0) {
		cout << "/!\\ Echec dans fonction Traction::demarrerThread. /!\\"<< endl;
	}
	else{
		cout << "Thread créé "<< endl;
	}
	ajouterThread(thread,PASSAGER);
}



void * Passager::threadPassager(void * params){
	Passager * pass = reinterpret_cast<Passager*>(params);
	pass->attendreTramway();
	while(1);
	// Terminaison du thread.
	pthread_exit(NULL);
	return 0;
}

pthread_t Passager::getThread(){
	return this->thread;
}

Passager::~Passager() {
	// TODO Auto-generated destructor stub
}
